// 配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';
//使用插件
Vue.use(VueRouter)
import routes from "@/router/routes";
//引入store
import store from "@/store";

// 先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

// 重写push|replace方法
// 第一个参数：告诉原来的push方法，你往哪里跳转（传递哪些参数）
VueRouter.prototype.push = function (location, resolve, reject) {
    // console.log(this);
    if (resolve && reject) {
        // call和apply区别：都可以改变this指向。传递参数为普通参数和数组参数
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        // call和apply区别：都可以改变this指向。传递参数为普通参数和数组参数
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}

//配置路由
let router = new VueRouter({
    // 配置路由
    routes,
    scrollBehavior(to, from, savedPosition) {
        // ...return 期望滚动到哪个地方
        // 返回的 y 代表的是滚动到最上方
        return { y: 100 }
    }
})
//全局守卫： 前置守卫（在路由跳转之前进行判断
router.beforeEach(async (to, from, next) => {
    //to:可以获取的你要跳转的哪个路由信息
    //from:可以获取到你从哪个路由而来的信息
    // next:放行函数 next() --- next('/login)只放行到指定的登录页 --- next(false)中断当前导航【改变路由了，重置到开始来的路由】
    // next();
    // console.log(store.state.user.token);
    //用户登录了，才会有token，未登录一定不会有token
    let token = store.state.user.token
    //用户的信息
    let name = store.state.user.userInfo.name
    //用户已经登录了
    if (token) {
        //用户已经登录了，但是还想去login页面，不允许
        if (to.path == '/login') {
            next('/home')
            console.log('1111 已经登录，还想去login，不允许');
        } else {
            //登录了但是去的不是 login【可能hoem|search|detail|shopCart】
            if(name){
                next()
                console.log('2222 已经登录，不去login，【可能hoem|search|detail|shopCart】');
            }else{
                //没有用户信息，派发aciotn，让仓库中有了用户信息再次进行跳转
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    //放行
                    next()
                    console.log('3333 没有用户信息，派发aciotn，让仓库中有了用户信息【name】再次进行跳转');
                } catch (error) {
                    //token过期了,获取不到用户信息   清除token,重新登录
                    await store.dispatch('userLogout')
                    next('/login')
                    console.log('4444 token过期了，重新登录，清除token');
                    // alert(error.message)
                }
            }
            
        }
    } else {
        //未登录先全部放行，还有限制，不能去交易、支付【pay|paysuccess】、个人中心等相关页面
        //未登录想要去上面这些页面---先跳转去登录页面
        
        let toPath = to.path
        // if(toPath=='/trade')
        //indexOf('/pay')路径包含pay就不行，包括【pay|paysuccess】两个页面
        if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1 || toPath.indexOf('/center')!=-1){
            //把未登录的时候想去而没有去成的信息，存储在地址栏中【路由中】
            next('/login?redirect='+toPath)
        }else{
            //未登录去的是（home|search|shopCart）--- 放行
            next()
        }
        
        console.log('5555 未登录');
    }
})

export default router;